1 - Create Two Scenarios with Two Materials¶

This journal shows how to load the baselines and run the dynamic mas flow analysis, plotting the results for two scenarios and two materials.

Step 1: Set Working Folder and Import PV ICE¶

In [1]:
import os
from pathlib import Path

testfolder = str(Path().resolve().parent.parent / 'PV_ICE' / 'TEMP' / 'Tutorial1')

if not os.path.exists(testfolder):
    os.makedirs(testfolder)

print ("Your simulation will be stored in %s" % testfolder)
Your simulation will be stored in C:\Users\sayala\Documents\GitHub\PV_ICE\PV_ICE\TEMP\Tutorial1
In [2]:
import PV_ICE
In [3]:
PV_ICE.__version__
Out[3]:
'v0.2.0+446.g3a586dc.dirty'

Step 2: Add Scenarios and Materials¶

silicon and glass materials are added to the two simulations, along with a scenario, in this case the baseline_modules_US. The baseline files for decadence scenario will be modified.

In [4]:
r1 = PV_ICE.Simulation(name='Simulation1', path=testfolder)
r1.createScenario(name='standard', massmodulefile=r'..\..\baselines\baseline_modules_mass_US.csv')
r1.scenario['standard'].addMaterial('glass', massmatfile=r'..\..\baselines\baseline_material_mass_glass.csv' )
r1.scenario['standard'].addMaterial('silicon', massmatfile=r'..\..\baselines\baseline_material_mass_silicon.csv' )

r1.createScenario('decadence', massmodulefile=r'..\..\baselines\baseline_modules_mass_US.csv')
r1.scenario['decadence'].addMaterial('glass', massmatfile=r'..\..\baselines\baseline_material_mass_glass.csv')
r1.scenario['decadence'].addMaterial('silicon', massmatfile=r'..\..\baselines\baseline_material_mass_silicon.csv')
path = C:\Users\sayala\Documents\GitHub\PV_ICE\PV_ICE\TEMP\Tutorial1

Exploring that the data got loaded properly, we can look at each scenario object, and material object saved dataframe and properties

In [5]:
r1.scenario['standard'].dataIn_m.head(2)
Out[5]:
year new_Installed_Capacity_[MW] mod_eff mod_reliability_t50 mod_reliability_t90 mod_degradation mod_lifetime mod_MFG_eff mod_Repair mod_MerchantTail ... mod_EOL_pg1_landfill mod_EOL_pg2_stored mod_EOL_pg3_reMFG mod_EOL_pg4_recycled mod_EOL_reMFG_yield mod_EOL_sp_reMFG_recycle mod_EOL_pb1_landfill mod_EOL_pb2_stored mod_EOL_pb3_reMFG mod_EOL_pb4_recycled
0 1995 12.500000 12.5 16.0 21.0 0.75 10.0 98.0 0.0 0.0 ... 60.0 0.0 0.0 40.0 0.0 100.0 60.0 0.0 0.0 40.0
1 1996 9.667667 12.7 16.0 21.0 0.75 10.0 98.0 0.0 0.0 ... 60.0 0.0 0.0 40.0 0.0 100.0 60.0 0.0 0.0 40.0

2 rows × 22 columns

In [6]:
r1.scenario['standard'].material['silicon'].matdataIn_m.head(2)
Out[6]:
year mat_virgin_eff mat_massperm2 mat_MFG_eff mat_MFG_scrap_Recycled mat_MFG_scrap_Recycling_eff mat_MFG_scrap_Recycled_into_HQ mat_MFG_scrap_Recycled_into_HQ_Reused4MFG mat_PG3_ReMFG_target mat_ReMFG_yield mat_PG4_Recycling_target mat_Recycling_yield mat_EOL_Recycled_into_HQ mat_EOL_RecycledHQ_Reused4MFG
0 1995 20.0 848.421429 45.0 100.0 20.0 0.0 100.0 0.0 0.0 20.0 80.0 0.0 0.0
1 1996 20.4 831.785714 45.0 100.0 20.0 0.0 100.0 0.0 0.0 20.0 80.0 0.0 0.0

Step 4: Run the Mass Flow Calculations on All Scenarios and Materials¶

In [7]:
r1.calculateMassFlow()
>>>> Calculating Material Flows <<<<

Working on Scenario:  standard
********************
Finished Area+Power Generation Calculations
==> Working on Material :  glass
==> Working on Material :  silicon
Working on Scenario:  decadence
********************
Finished Area+Power Generation Calculations
==> Working on Material :  glass
==> Working on Material :  silicon

Now we have results on the mass layer that we can access

In [8]:
r1.scenario['standard'].dataOut_m.keys()
Out[8]:
Index(['Area', 'Cumulative_Active_Area', 'EOL_BadStatus', 'EOL_Landfill0',
       'EOL_PATHS', 'EOL_PG', 'Effective_Capacity_[W]', 'Landfill_0_ProjLife',
       'MerchantTail_Area', 'MerchantTail_[W]', 'ModuleTotal_MFG', 'P2_stored',
       'P3_reMFG', 'P4_recycled', 'PB1_landfill', 'PB2_stored', 'PB3_reMFG',
       'PB3_reMFG_unyield', 'PB3_reMFG_yield', 'PB4_recycled', 'PG1_landfill',
       'PG2_stored', 'PG3_reMFG', 'PG3_reMFG_unyield', 'PG3_reMFG_yield',
       'PG4_recycled', 'Power_Degraded_[W]', 'Repaired_Area', 'Repaired_[W]',
       'Resold_Area', 'Resold_[W]', 'WeibullParams',
       'Yearly_Sum_Area_EOLby_Degradation', 'Yearly_Sum_Area_EOLby_Failure',
       'Yearly_Sum_Area_EOLby_ProjectLifetime', 'Yearly_Sum_Area_PathsBad',
       'Yearly_Sum_Area_PathsGood', 'Yearly_Sum_Area_atEOL',
       'Yearly_Sum_Power_EOLby_Degradation', 'Yearly_Sum_Power_EOLby_Failure',
       'Yearly_Sum_Power_EOLby_ProjectLifetime', 'Yearly_Sum_Power_PathsBad',
       'Yearly_Sum_Power_PathsGood', 'Yearly_Sum_Power_atEOL',
       'irradiance_stc'],
      dtype='object')

What can aggregate results from dataOut_m and matdataOut_m and compile the data so we can use it more easily

In [9]:
USyearly, UScum = r1.aggregateResults()
# r1.USyearly
# r1.UScum
In [10]:
USyearly.keys()
Out[10]:
Index(['VirginStock_glass_Simulation1_standard_[Tonnes]',
       'VirginStock_silicon_Simulation1_standard_[Tonnes]',
       'VirginStock_Module_Simulation1_standard_[Tonnes]',
       'WasteAll_glass_Simulation1_standard_[Tonnes]',
       'WasteAll_silicon_Simulation1_standard_[Tonnes]',
       'WasteAll_Module_Simulation1_standard_[Tonnes]',
       'WasteEOL_glass_Simulation1_standard_[Tonnes]',
       'WasteEOL_silicon_Simulation1_standard_[Tonnes]',
       'WasteEOL_Module_Simulation1_standard_[Tonnes]',
       'WasteMFG_glass_Simulation1_standard_[Tonnes]',
       'WasteMFG_silicon_Simulation1_standard_[Tonnes]',
       'WasteMFG_Module_Simulation1_standard_[Tonnes]',
       'VirginStock_glass_Simulation1_decadence_[Tonnes]',
       'VirginStock_silicon_Simulation1_decadence_[Tonnes]',
       'VirginStock_Module_Simulation1_decadence_[Tonnes]',
       'WasteAll_glass_Simulation1_decadence_[Tonnes]',
       'WasteAll_silicon_Simulation1_decadence_[Tonnes]',
       'WasteAll_Module_Simulation1_decadence_[Tonnes]',
       'WasteEOL_glass_Simulation1_decadence_[Tonnes]',
       'WasteEOL_silicon_Simulation1_decadence_[Tonnes]',
       'WasteEOL_Module_Simulation1_decadence_[Tonnes]',
       'WasteMFG_glass_Simulation1_decadence_[Tonnes]',
       'WasteMFG_silicon_Simulation1_decadence_[Tonnes]',
       'WasteMFG_Module_Simulation1_decadence_[Tonnes]',
       'newInstalledCapacity_Simulation1_standard_[MW]',
       'newInstalledCapacity_Simulation1_decadence_[MW]',
       'ActiveCapacity_Simulation1_standard_[MW]',
       'DecommisionedCapacity_Simulation1_standard_[MW]',
       'ActiveCapacity_Simulation1_decadence_[MW]',
       'DecommisionedCapacity_Simulation1_decadence_[MW]'],
      dtype='object')
In [11]:
UScum.keys()
Out[11]:
Index(['VirginStock_glass_Simulation1_standard_[Tonnes]',
       'VirginStock_silicon_Simulation1_standard_[Tonnes]',
       'VirginStock_Module_Simulation1_standard_[Tonnes]',
       'WasteAll_glass_Simulation1_standard_[Tonnes]',
       'WasteAll_silicon_Simulation1_standard_[Tonnes]',
       'WasteAll_Module_Simulation1_standard_[Tonnes]',
       'WasteEOL_glass_Simulation1_standard_[Tonnes]',
       'WasteEOL_silicon_Simulation1_standard_[Tonnes]',
       'WasteEOL_Module_Simulation1_standard_[Tonnes]',
       'WasteMFG_glass_Simulation1_standard_[Tonnes]',
       'WasteMFG_silicon_Simulation1_standard_[Tonnes]',
       'WasteMFG_Module_Simulation1_standard_[Tonnes]',
       'VirginStock_glass_Simulation1_decadence_[Tonnes]',
       'VirginStock_silicon_Simulation1_decadence_[Tonnes]',
       'VirginStock_Module_Simulation1_decadence_[Tonnes]',
       'WasteAll_glass_Simulation1_decadence_[Tonnes]',
       'WasteAll_silicon_Simulation1_decadence_[Tonnes]',
       'WasteAll_Module_Simulation1_decadence_[Tonnes]',
       'WasteEOL_glass_Simulation1_decadence_[Tonnes]',
       'WasteEOL_silicon_Simulation1_decadence_[Tonnes]',
       'WasteEOL_Module_Simulation1_decadence_[Tonnes]',
       'WasteMFG_glass_Simulation1_decadence_[Tonnes]',
       'WasteMFG_silicon_Simulation1_decadence_[Tonnes]',
       'WasteMFG_Module_Simulation1_decadence_[Tonnes]',
       'newInstalledCapacity_Simulation1_standard_[MW]',
       'newInstalledCapacity_Simulation1_decadence_[MW]'],
      dtype='object')
In [12]:
r1.saveSimulation()
:) Saved Input and Output Dataframes

Step 5: Use internal plotting functions to plot results¶

Pull out the keywords by printing the keys to the module data or the material data

In [13]:
print(r1.scenario['standard'].material['silicon'].matdataIn_m.keys())
Index(['year', 'mat_virgin_eff', 'mat_massperm2', 'mat_MFG_eff',
       'mat_MFG_scrap_Recycled', 'mat_MFG_scrap_Recycling_eff',
       'mat_MFG_scrap_Recycled_into_HQ',
       'mat_MFG_scrap_Recycled_into_HQ_Reused4MFG', 'mat_PG3_ReMFG_target',
       'mat_ReMFG_yield', 'mat_PG4_Recycling_target', 'mat_Recycling_yield',
       'mat_EOL_Recycled_into_HQ', 'mat_EOL_RecycledHQ_Reused4MFG'],
      dtype='object')
In [14]:
r1.plotScenariosComparison()
Please pass a keyword.
In [15]:
r1.plotMaterialComparisonAcrossScenarios(material='silicon', keyword='mat_virgin_eff')
In [16]:
r1.plotMaterialResults(keyword='VirginStock')
In [17]:
r1.plotMetricResults()
[]
In [18]:
r1.plotInstalledCapacityResults()
[]
In [ ]: